/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package comu;

import controlador.AbonatControlador;
import controlador.CampControlador;
import controlador.CollitaControlador;
import controlador.ProduccioControlador;
import controlador.TractamentControler;
import controlador.UnitatsMesuraControlador;
import entity.Abonat;
import entity.Abono;
import entity.Camp;
import entity.Collita;
import entity.Fitosanitari;
import entity.Produccio;
import entity.Productor;
import entity.Tractament;
import entity.UnitatsMesura;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import javax.imageio.ImageIO;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import vistas.textImg.Textos;

/**
 *
 * @author David
 */
public class Utilitats {

    public static void centrarVentana(Component c) {
        // Get the size of the screen
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

// Determine the new location of the window
        int w = c.getSize().width;
        int h = c.getSize().height;
        int x = (dim.width - w) / 2;
        int y = (dim.height - h) / 2;

// Move the window
        c.setLocation(x, y);
    }

    public static DefaultListModel getListModel(List llista) {
        DefaultListModel modelP = new DefaultListModel();
        for (int i = 0; i < llista.size(); i++) {
            modelP.addElement(llista.get(i));
        }
        return modelP;
    }

    public static DefaultComboBoxModel getComboBoxModel(List llista) {
        DefaultComboBoxModel modelP = new DefaultComboBoxModel();
        for (int i = 0; i < llista.size(); i++) {
            modelP.addElement(llista.get(i));
        }
        return modelP;
    }

    public static DefaultTreeModel getTreeModel(Productor productor, boolean acabats) {
        DefaultMutableTreeNode productorNode = new DefaultMutableTreeNode(productor);
        CampControlador camps = new CampControlador();
        ProduccioControlador produccions = new ProduccioControlador();
        CollitaControlador collites = new CollitaControlador();
        AbonatControlador abonats = new AbonatControlador();
        TractamentControler tractaments = new TractamentControler();

        Collection<Camp> llistaCamps = productor.getCampCollection();
        for (Camp camp : llistaCamps) {
            DefaultMutableTreeNode campNode = new DefaultMutableTreeNode(camp);
            productorNode.add(campNode);
            List<Produccio> llistaProduccions;
            if(acabats){
                llistaProduccions = produccions.findProduccioEntitiesByCamp(camp, true);
            }else{
                llistaProduccions = produccions.findProduccioEntitiesByCamp(camp, false);
            }
            for (Produccio produccio : llistaProduccions) {
                DefaultMutableTreeNode produccioNode = new DefaultMutableTreeNode(produccio);
                campNode.add(produccioNode);
                List<Collita> llistaCollites = collites.findCollitaEntitiesByProduccio(produccio);
                if(!llistaCollites.isEmpty()){
                    DefaultMutableTreeNode collitesNode = new DefaultMutableTreeNode(Textos.GENERAL_TREE_COLLITES);
                    produccioNode.add(collitesNode);
                    for (Collita collita : llistaCollites) {
                        DefaultMutableTreeNode collitaNode = new DefaultMutableTreeNode(collita);
                        collitesNode.add(collitaNode);
                    }
                }
                List<Tractament> llistaTractaments = tractaments.findTractamentEntitiesByProduccio(produccio);
                if (!llistaTractaments.isEmpty()) {
                    DefaultMutableTreeNode tractamentsNode = new DefaultMutableTreeNode(Textos.GENERAL_TREE_TRACTAMENTS);
                    produccioNode.add(tractamentsNode);
                    for (Tractament tractament : llistaTractaments) {
                        DefaultMutableTreeNode tractamentNode = new DefaultMutableTreeNode(tractament);
                        tractamentsNode.add(tractamentNode);
                    }
                }
                List<Abonat> llistaAbonats = abonats.findAbonatEntitiesByProduccio(produccio);
                if(!llistaAbonats.isEmpty()){
                    DefaultMutableTreeNode abonatsNode = new DefaultMutableTreeNode(Textos.GENERAL_TREE_ABONATS);
                    produccioNode.add(abonatsNode);
                    for (Abonat abonat : llistaAbonats) {
                        DefaultMutableTreeNode abonatNode = new DefaultMutableTreeNode(abonat);
                        abonatsNode.add(abonatNode);
                    }
                }
            }
        }
        DefaultTreeModel treeModel = new DefaultTreeModel(productorNode);
        return treeModel;
    }

    public static DefaultTreeModel getTreeModel(Produccio produccio){
        DefaultMutableTreeNode producteNode = new DefaultMutableTreeNode(produccio);
        CollitaControlador collites = new CollitaControlador();
        Collection<Collita> llistaCollites = produccio.getCollitaCollection();
        for(Collita collita : llistaCollites){
            DefaultMutableTreeNode collitaNode = new DefaultMutableTreeNode(collita);
            producteNode.add(collitaNode);
        }
        DefaultTreeModel treeModel = new DefaultTreeModel(producteNode);
        return treeModel;
    }
    
    public static void adabtarImatgeAlLabel(JLabel label, byte[] byteArray) throws IOException {
        int with = label.getWidth();
        int height = label.getHeight();
        ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
        BufferedImage src = ImageIO.read(bais);
        Image scaledImage = src.getScaledInstance(with, height, Image.SCALE_SMOOTH);
        BufferedImage imgBuff = new BufferedImage(with, height, BufferedImage.TYPE_INT_RGB);
        imgBuff.getGraphics().drawImage(scaledImage, 0, 0, new Color(0, 0, 0), null);
        label.setIcon(new ImageIcon(imgBuff));
    }

    public static Image adabtarImatgenSinDeformar(int width, int height, Image nuevaImagen) {
        Image imgEscalada;
        int excesoHeight = nuevaImagen.getHeight(null) - height;
        int excesoWidth = nuevaImagen.getWidth(null) - width;
        if (excesoHeight > excesoWidth) {
            imgEscalada = nuevaImagen.getScaledInstance(-1, height, Image.SCALE_FAST);
        } else {
            imgEscalada = nuevaImagen.getScaledInstance(width, -1, Image.SCALE_FAST);
        }
        return imgEscalada;
    }


    public static void Imprimir(String producte, String data, String quant, String traz) throws PrinterException {
        PrinterJob pj = PrinterJob.getPrinterJob();
        Full full = new Full(producte,data, quant, traz);
        if (pj.printDialog()) {
            pj.setPrintable(full);
            pj.print();
        }
    }

    public static String getDescripcio(Produccio produccio) {
        String out = "";
        out += Textos.DESCRIPCIO_PRODUCCIO_DATA + Configuracio.sdf.format(produccio.getDataPlanta().getTime()) + "\n";
        out += Textos.DESCRIPCIO_PRODUCCIO_PRODUCTE + produccio.getProductesId().getNom() + "\n";
        out += Textos.DESCRIPCIO_PRODUCCIO_QUANTITAT + produccio.getQuantitat() + " " + produccio.getUnitatsMesuraId().getNom() + "\n";
        out += Textos.DESCRIPCIO_PRODUCCIO_VARIETAT + produccio.getVarietat() + "\n";
        out += Textos.DESCRIPCIO_PRODUCCIO_ORIGEN + produccio.getOrigen() + "\n";
        out += Textos.DESCRIPCIO_PRODUCCIO_ACABADA;
        if (produccio.getTerminado()) {
            out += " Si";
        } else {
            out += " No";
        }
        out += "\n" + "\n";
        out += Textos.DESCRIPCIO_PRODUCCIO_TOTAL_COLLIT + "\n" + calcularTotalCollit(produccio);
        return out;
    }

    public static String getDescripcio(Camp camp) {
        String out= "";
        out += Textos.DESCRIPCIO_CAMP_NOM + camp.getNom()+ "\n";
        out += Textos.DESCRIPCIO_CAMP_PRODUCTOR + camp.getProductorId().getNom()+ "\n";
        out += Textos.DESCRIPCIO_CAMP_LOCALITAT + camp.getLocalitat()+ "\n";
        return out;
    }
    
    public static String getDescripcio(Collita collita) {
        String out= "";
        out += Textos.DESCRIPCIO_COLLITA_DATA + Configuracio.sdf.format(collita.getData().getTime()) + "\n";
        out += Textos.DESCRIPCIO_COLLITA_QUANTITAT + collita.getQuantitat() +" "+collita.getUnitatsMesuraId().getNom()+ "\n";
        out += Textos.DESCRIPCIO_COLLITA_PRODUCTE + collita.getProduccioId().getProductesId().getNom()+ "\n";
        out += Textos.DESCRIPCIO_COLLITA_CAMP + collita.getProduccioId().getCampId().getNom()+ "\n";
        
        return out;
    }
    
    public static String getDescripcio(Abonat abonat) {
        String out= "";
        out += Textos.DESCRIPCIO_ABONAT_ABONO + abonat.getAbonoId().getNom() + "\n";
        out += Textos.DESCRIPCIO_ABONAT_DATA + Configuracio.sdf.format(abonat.getDataAbonat()) + "\n";
        out += Textos.DESCRIPCIO_ABONAT_QUANTITAT + abonat.getQuantitat() + "\n";
        out += Textos.DESCRIPCIO_ABONAT_MODE_APLICACIO + abonat.getModeAplicacioId().getNom() + "\n";
        return out;
    }
    
    public static String getDescripcio(Tractament tractament) {
        String out= "";
        out += Textos.DESCRIPCIO_TRACTAMENT_DATA + Configuracio.sdf.format(tractament.getDataTractament()) + "\n";
        out += Textos.DESCRIPCIO_TRACTAMENT_FITOS + tractament.getFitosanitariId().getNomComercial() + "\n";
        out += Textos.DESCRIPCIO_TRACTAMENT_DOSIS + tractament.getDosis() + tractament.getFitosanitariId().getUnitatsDosis().getNom() + "/" + tractament.getFitosanitariId().getUnitatsDisolucio().getNom() + "\n";
        out += Textos.DESCRIPCIO_TRACTAMENT_MODE_APLICACIO + tractament.getModeAplicacioId().getNom() + "\n";
        out += Textos.DESCRIPCIO_TRACTAMENT_OBSERVACIONS + tractament.getObservacions() + "\n";
        return out;
    } 
    
    public static String getDescripcio(Abono abono) {
        String out= "";
        out += Textos.DESCRIPCIO_ABONO_NOM + abono.getNom() + "\n";
        out += Textos.DESCRIPCIO_ABONO_COMPOSICIO + abono.getComposicio() + "\n";
        out += Textos.DESCRIPCIO_ABONO_QUANTITAT + abono.getUnitatsPaquet().getNom()+" de "+ abono.getQuantitatPaquet() + abono.getUnitatsQuantitat().getNom() + "\n";
        return out;
    }

    public static String getDescripcio(Fitosanitari fitos) {
        String out= "";
        out += Textos.DESCRIPCIO_FITOS_NOM + fitos.getNomComercial() + "\n";
        out += Textos.DESCRIPCIO_FITOS_MATERIA_ACTIVA + fitos.getMateriaActiva() + "\n";
        out += Textos.DESCRIPCIO_FITOS_COMPOSICIO + fitos.getComposicio() + "\n";
        out += Textos.DESCRIPCIO_FITOS_DOSIS + fitos.getDosis() + fitos.getUnitatsDosis().getNom() + "/" + fitos.getUnitatsDisolucio().getNom() + "\n";
        out += Textos.DESCRIPCIO_FITOS_PLAZ_SEG + fitos.getPlazSegurDies() + "\n";
        out += Textos.DESCRIPCIO_FITOS_NUM_REG + fitos.getNumRegistre() + "\n";
        out += Textos.DESCRIPCIO_FITOS_DATA_FI + Configuracio.sdf_ddMMyyyy.format(fitos.getDataFiAutoritzacio()) + "\n";
        out += Textos.DESCRIPCIO_FITOS_PRODUCTES_AUTOR + fitos.getProducAutortizats() + "\n";
        return out;
    }
    private static String calcularTotalCollit(Produccio produccio) {
        UnitatsMesuraControlador unitatsMesura = new UnitatsMesuraControlador();
        CollitaControlador collites = new CollitaControlador();
        List<UnitatsMesura> unitats = unitatsMesura.findUnitatsMesuraEntitiesForCollir();
        HashMap<UnitatsMesura, Integer> totals = new HashMap<UnitatsMesura, Integer>();
        for (UnitatsMesura unitatMesura : unitats) {
            totals.put(unitatMesura, 0);
        }
        Collection<Collita> collitesList = produccio.getCollitaCollection();
        for (Collita collita : collitesList) {
            if (totals.containsKey(collita.getUnitatsMesuraId())) {
                totals.put(collita.getUnitatsMesuraId(), totals.get(collita.getUnitatsMesuraId()) + collita.getQuantitat());
            }
        }
        String out = "";
        Set<UnitatsMesura> lTotals = totals.keySet();
        for (UnitatsMesura unitat : lTotals) {
            int valor = totals.get(unitat).intValue();
            if(valor != 0)
            out += "     " + String.valueOf(valor)+" "+ unitat.getNom() + "\n";
        }
        return out;
    }
    
    public static boolean compleixPlazSeguretat(Produccio produccio){
        TractamentControler tractaments = null;
        if(produccio != null){
            if(tractaments == null){
                tractaments = new TractamentControler();
            }
            List<Tractament> llistaTractaments = tractaments.findLastTractamentEntityByProduccio(produccio);
            if((llistaTractaments != null)&&(!llistaTractaments.isEmpty())){
                Tractament trac = llistaTractaments.get(0);
                if(trac != null){
                    Calendar hoyMenosPlaz = Calendar.getInstance();
                    hoyMenosPlaz.add(Calendar.DATE, -trac.getFitosanitariId().getPlazSegurDies());
                    if((trac.getDataTractament().equals(hoyMenosPlaz.getTime()))||(trac.getDataTractament().after(hoyMenosPlaz.getTime()))){
                       return false; 
                    }else{
                        return true;
                    }
                }else {
                    return true;
                }
            }
        }else{
            return true;
        }
        return true;
    }

    private static class Full implements Printable {

        String data, traz, quant, producte;

        private Full(String producte, String data, String quant, String traz) {
            this.producte = producte;
            this.data = data;
            this.quant = quant;
            this.traz = traz;
        }

        @Override
        public int print(Graphics grphcs, PageFormat pf, int i) throws PrinterException {

            Graphics2D g2d;
            //--- Validate the page number, we only print the first page
            if (i == 0) {  //--- Create a graphic2D object a set the default parameters
                g2d = (Graphics2D) grphcs;
                g2d.setColor(Color.black);
                g2d.setFont(Textos.FONT_IMPRIMIR);

                //--- Translate the origin to be (0,0)
                g2d.translate(pf.getImageableX(), pf.getImageableY());
                int offset = 100;
                g2d.drawString(data, 0, offset);
                g2d.drawString(producte, 0, offset + Textos.FONT_IMPRIMIR.getSize() + 25);
                g2d.drawString(quant, 0, offset + ((Textos.FONT_IMPRIMIR.getSize() + 25) * 2));
                g2d.drawString(traz, 0, offset + ((Textos.FONT_IMPRIMIR.getSize() + 25) * 3));
                return (PAGE_EXISTS);
            } else {
                return (NO_SUCH_PAGE);
            }
        }
    }
}
